#ifndef AICONSOLEVARIABLES_H
#define AICONSOLEVARIABLES_H

struct AIConsoleVars
{
	void Init();

	DeclareConstIntCVar(UseCalculationStopperCounter, 0);
	DeclareConstIntCVar(DebugDraw, -1);

	DeclareConstIntCVar(CoverMaxEyeCount, 2);
	DeclareConstIntCVar(DebugDrawCover, 0);
	DeclareConstIntCVar(DebugDrawNavigation, 0);
	DeclareConstIntCVar(DebugDrawNavigationWorldMonitor, 0);
	DeclareConstIntCVar(NavigationSystemMT, 1);
	DeclareConstIntCVar(DebugDrawCoverPlanes, 0);
	DeclareConstIntCVar(DebugDrawCoverLocations, 0);
	DeclareConstIntCVar(DebugDrawCoverSampler, 0);
	DeclareConstIntCVar(DebugDrawDynamicCoverSampler, 0);
	DeclareConstIntCVar(CoverSystem, 1);
	DeclareConstIntCVar(CoverExactPositioning, 0);

	DeclareConstIntCVar(DebugDrawHideSpotRange, 0);
	DeclareConstIntCVar(DebugDrawDynamicHideObjectsRange, 0);
	DeclareConstIntCVar(DebugDrawVolumeVoxels, 0);
	DeclareConstIntCVar(DebugDrawDeadBodies, 0);
	DeclareConstIntCVar(DebugPathFinding, 0);
	DeclareConstIntCVar(DebugCheckWalkability, 0);
	DeclareConstIntCVar(DebugWalkabilityCache, 0);
	DeclareConstIntCVar(DebugDrawBannedNavsos, 0);
	DeclareConstIntCVar(DebugDrawGroups, 0);
	DeclareConstIntCVar(DebugDrawCoolMisses, 0);
	DeclareConstIntCVar(DebugDrawFireCommand, 0);
	DeclareConstIntCVar(UseSimplePathfindingHeuristic, 0);

	DeclareConstIntCVar(DebugDrawCoordination, 0);
	DeclareConstIntCVar(DebugDrawCommunication, 0);
	DeclareConstIntCVar(DebugDrawCommunicationHistoryDepth, 5);
	DeclareConstIntCVar(RecordCommunicationStats, 0);
	DeclareConstIntCVar(CommunicationForceTestVoicePack, 0);
	DeclareConstIntCVar(SoundPerception, 1);
	DeclareConstIntCVar(IgnorePlayer, 0);
	DeclareConstIntCVar(IgnoreVisibilityChecks, 0);
	DeclareConstIntCVar(DrawModifiers, 0);
	DeclareConstIntCVar(AllTime, 0);
	DeclareConstIntCVar(ProfileGoals, 0);
	DeclareConstIntCVar(TargetMovingAccuracyMultiplier, 0);
	DeclareConstIntCVar(LateralMovementAccuracyDecay, 1);
	DeclareConstIntCVar(BeautifyPath, 1);
	DeclareConstIntCVar(PathStringPullingIterations, 3);
	DeclareConstIntCVar(AttemptStraightPath, 1);
	DeclareConstIntCVar(PredictivePathFollowing, 1);
	DeclareConstIntCVar(CrowdControlInPathfind, 0);
	DeclareConstIntCVar(DebugDrawCrowdControl, 0);
	DeclareConstIntCVar(UpdateProxy, 1);
	DeclareConstIntCVar(DrawType, -1);
	DeclareConstIntCVar(AdjustPathsAroundDynamicObstacles, 1);
	DeclareConstIntCVar(DrawFormations, 0);
	DeclareConstIntCVar(DrawPatterns, 0);
	DeclareConstIntCVar(DrawSmartObjects, 0);
	DeclareConstIntCVar(DrawReadibilities, 0);
	DeclareConstIntCVar(DrawGoals, 0);
	DeclareConstIntCVar(DebugGroupCoordinationSelection, 0);
	DeclareConstIntCVar(DrawNodeLinkType, 0);
	DeclareConstIntCVar(DrawTargets, 0);
	DeclareConstIntCVar(DrawBadAnchors, -1);
	DeclareConstIntCVar(DrawStats, 0);
	DeclareConstIntCVar(DrawAttentionTargetsPosition, 0);
	DeclareConstIntCVar(DrawHideSpotSearchRays, 0);

	DeclareConstIntCVar(DebugDrawVegetationCollisionDist, 0);
	DeclareConstIntCVar(RecordLog, 0);
	DeclareConstIntCVar(DrawTrajectory, 0);
	DeclareConstIntCVar(DrawHideSpots, 0);
	DeclareConstIntCVar(DrawRadar, 0);
	DeclareConstIntCVar(DrawRadarDist, 20);
	DeclareConstIntCVar(DebugRecordAuto, 0);
	DeclareConstIntCVar(DebugRecordBuffer, 1024);
	DeclareConstIntCVar(DrawGroupTactic, 0);
	DeclareConstIntCVar(UpdateAllAlways, 0);
	DeclareConstIntCVar(DrawDistanceLUT, 0);
	DeclareConstIntCVar(PuppetDirSpeedControl, 1);
	DeclareConstIntCVar(DrawAreas, 0);
	DeclareConstIntCVar(DrawProbableTarget, 0);
	DeclareConstIntCVar(IncludeNonColEntitiesInNavigation, 1);
	DeclareConstIntCVar(DebugDrawDamageParts, 0);
	DeclareConstIntCVar(DebugDrawStanceSize, 0);
	DeclareConstIntCVar(DebugDrawUpdate, 0);
	DeclareConstIntCVar(DebugDrawEnabledActors, 0);
	DeclareConstIntCVar(DebugDrawVehicles, 0);
	DeclareConstIntCVar(DebugDrawEnabledPlayers, 0);
	DeclareConstIntCVar(DebugDrawLightLevel, 0);
	DeclareConstIntCVar(IgnoreDeadBodies, 0);
	DeclareConstIntCVar(DebugDrawPhysicsAccess, 0);
	DeclareConstIntCVar(WarnSignalDuration, 40);
	DeclareConstIntCVar(RayCasterQuota, 12);
	DeclareConstIntCVar(IntersectionTesterQuota, 12);
	DeclareConstIntCVar(AmbientFireEnable, 1);
	DeclareConstIntCVar(DebugDrawAmbientFire, 0);
	DeclareConstIntCVar(PlayerAffectedByLight, 1);
	DeclareConstIntCVar(DebugDrawExpensiveAccessoryQuota, 0);
	DeclareConstIntCVar(DebugTargetSilhouette, 0);
	DeclareConstIntCVar(DebugDrawDamageControl, 0);
	DeclareConstIntCVar(DrawFakeTracers, 0);
	DeclareConstIntCVar(DrawFakeHitEffects, 0);
	DeclareConstIntCVar(DrawFakeDamageInd, 0);
	DeclareConstIntCVar(DrawPlayerRanges, 0);
	DeclareConstIntCVar(DrawPerceptionIndicators, 0);
	DeclareConstIntCVar(DrawPerceptionDebugging, 0);
	DeclareConstIntCVar(DrawPerceptionModifiers, 0);
	DeclareConstIntCVar(DebugPerceptionManager, 0);
	DeclareConstIntCVar(TargetTracking, 2);
	DeclareConstIntCVar(TargetTracks_GlobalTargetLimit, 0);
	DeclareConstIntCVar(TargetTracks_TargetDebugDraw, 0);
	DeclareConstIntCVar(TargetTracks_ConfigDebugDraw, 0);

	DeclareConstIntCVar(ForceStance, -1);
	DeclareConstIntCVar(ForceAllowStrafing, -1);

	DeclareConstIntCVar(DebugDrawAdaptiveUrgency, 0);
	DeclareConstIntCVar(DebugDrawPlayerActions, 0);
	DeclareConstIntCVar(DrawCollisionEvents, 0);
	DeclareConstIntCVar(DrawBulletEvents, 0);
	DeclareConstIntCVar(DrawSoundEvents, 0);
	DeclareConstIntCVar(DrawGrenadeEvents, 0);
	DeclareConstIntCVar(DrawExplosions, 0);

	DeclareConstIntCVar(SimpleWayptPassability, 1);
	DeclareConstIntCVar(ThreadedVolumeNavPreprocess, 1);

	DeclareConstIntCVar(UseAlternativeReadability, 0);

	DeclareConstIntCVar(WaterOcclusionEnable, 1);

	DeclareConstIntCVar(EnablePerceptionStanceVisibleRange, 0);
	DeclareConstIntCVar(IgnoreVisualStimulus, 0);
	DeclareConstIntCVar(IgnoreSoundStimulus, 0);
	DeclareConstIntCVar(IgnoreBulletRainStimulus, 0);


	// Interest system
	DeclareConstIntCVar(InterestSystem, 1);
	DeclareConstIntCVar(DebugInterest, 0);
	DeclareConstIntCVar(InterestSystemCastRays, 1);

	// Code coverage
	DeclareConstIntCVar(CodeCoverage, 0);

	// Path Follower
	DeclareConstIntCVar(UseSmartPathFollower, 1);
	DeclareConstIntCVar(SmartpathFollower_UseAABB_CheckWalkibility, 1);
	
	DeclareConstIntCVar(DrawPathFollower, 0);

	DeclareConstIntCVar(LogConsoleVerbosity, 0);
	DeclareConstIntCVar(LogFileVerbosity, 0);
	DeclareConstIntCVar(EnableWarningsErrors, 0);


	DeclareConstIntCVar(ShowBehaviorCalls, 0);

	DeclareConstIntCVar(Recorder, 0);
	DeclareConstIntCVar(StatsDisplayMode, 0);

	DeclareConstIntCVar(DebugDrawVisionMap, 0);

	DeclareConstIntCVar(DrawFireEffectEnabled, 1);

	DeclareConstIntCVar(AllowedToHitPlayer, 1);
	DeclareConstIntCVar(AllowedToHit, 1);
	DeclareConstIntCVar(EnableCoolMisses, 1);

	DeclareConstIntCVar(WIPCode, 0);
	DeclareConstIntCVar(DynamicHidespotsEnabled, 0);

	DeclareConstIntCVar(ForceSerializeAllObjects, 0);

	DeclareConstIntCVar(EnableORCA, 1);
	DeclareConstIntCVar(DebugCollisionAvoidanceUpdateVelocities, 1);
	DeclareConstIntCVar(DebugDrawCollisionAvoidance, 0);
	DeclareConstIntCVar(CollisionAvoidanceClampVelocitiesWithNavigationMesh, 0);

	DeclareConstIntCVar(DebugDrawPathfinderQueue, 0);

	const char* DrawPath;
	const char* DrawPathAdjustment;

	float CheckWalkabilityOptimalSectionLength;
	float TacticalPointUpdateTime;
	const char* CompatibilityMode;
	float AllowedTimeForPathfinding;
	float PathfinderUpdateTime;
	float DrawAgentFOV;
	float AgentStatsDist;
	int AiSystem;
	float DebugDrawArrowLabelsVisibilityDistance;
	const char* DebugDrawAStarOpenList;
	float DebugDrawAStarOpenListTime;
	float DebugCheckWalkabilityRadius;

	float CoverPredictTarget;
	float CoverSpacing;

	const char* StatsTarget;
	const char* BehaviorStatsTarget;
	const char* DebugBehaviorSelection;
	float AIUpdateInterval;
	float DynamicWaypointUpdateTime;
	float DynamicVolumeUpdateTime;
	float LayerSwitchDynamicLinkBump;
	int LayerSwitchDynamicLinkBumpDuration;
	float SmartObjectUpdateTime;

	float CollisionAvoidanceAgentExtraFat;
	float CollisionAvoidanceRange;
	float CollisionAvoidanceTargetCutoffRange;
	float CollisionAvoidancePathEndCutoffRange;
	float CollisionAvoidanceSmartObjectCutoffRange;
	float CollisionAvoidanceTimeStep;
	float CollisionAvoidanceMinSpeed;
	float CollisionAvoidanceAgentTimeHorizon;
	float CollisionAvoidanceObstacleTimeHorizon;
	float DebugCollisionAvoidanceForceSpeed;
	const char* DebugDrawCollisionAvoidanceAgentName;
	
	const char* DrawRefPoints;
	int DrawTagPoints;
	const char* DrawNode;
	float DrawNodeLinkCutoff;
	const char* DrawLocate;
	float DebugDrawOffset;
	float SteepSlopeUpValue;
	float SteepSlopeAcrossValue;
	float ExtraRadiusDuringBeautification;
	float ExtraForbiddenRadiusDuringBeautification;
	float RadiusForAutoForbidden;
	const char* DrawShooting;
	const char* DebugDrawHashSpaceAround;

	float BurstWhileMovingDestinationRange;
	const char* DrawAgentStats;

	const char* DebugHideSpotName;

	float SOMSpeedRelaxed;
	float SOMSpeedCombat;

	float SightRangeSuperDarkIllumMod;
	float SightRangeDarkIllumMod;
	float SightRangeMediumIllumMod;

	float MovementSpeedSuperDarkIllumMod;
	float MovementSpeedDarkIllumMod;
	float MovementSpeedMediumIllumMod;

	float RODAliveTime;
	float RODMoveInc;
	float RODStanceInc;
	float RODDirInc;
	float RODAmbientFireInc;
	float RODKillZoneInc;
	float RODFakeHitChance;

	float RODKillRangeMod;
	float RODCombatRangeMod;

	float RODReactionTime;
	float RODReactionSuperDarkIllumInc;
	float RODReactionDarkIllumInc;
	float RODReactionMediumIllumInc;
	float RODReactionDistInc;
	float RODReactionDirInc;
	float RODReactionLeanInc;

	float RODLowHealthMercyTime;
	float RODCheckpointMercyTime;

	float RODCoverFireTimeMod;

	int AmbientFireQuota;
	float AmbientFireUpdateInterval;

	const char* DrawPerceptionHandlerModifiers;
	float TargetTracks_DeadForgetTime;
	const char* TargetTracks_AgentDebugDraw;
	const char* TargetTracks_ConfigDebugFilter;
	const char* DrawAgentStatsGroupFilter;

	const char* ForceAGAction;
	const char* ForceAGSignal;
	const char* ForcePosture;
	const char* ForceLookAimTarget;

	float BannedNavSoTime;
	float WaterOcclusionScale;

	float CloakMinDist;
	float CloakMaxDist;
	float CloakIncrement;

	float BigBrushLimitSize;

	float ExtraVehicleAvoidanceRadiusBig;
	float ExtraVehicleAvoidanceRadiusSmall;
	float ObstacleSizeThreshold;
	float DrawGetEnclosingFailures;

	// Startup mode
	const char* StartupMode;

	// Perception handler override
	float CrouchVisibleRange;
	float ProneVisibleRange;
	const char* DrawAgentType;

	int useMNM; // TODO: remove
	int MNMDebugAccessibility; // TODO: remove
	int MNMEditorBackgroundUpdate; //TOD: remove once tested
	
	float MNMPathFinderQuota;
	int MNMPathFinderDebug;

	int MNMProfileMemory;

	float OverlayMessageDuration;
	float DrawFireEffectDecayRange;
	float DrawFireEffectMinDistance;
	float DrawFireEffectMinTargetFOV;
	float DrawFireEffectMaxAngle;
	float DrawFireEffectTimeScale;

	float CoolMissesBoxSize;
	float CoolMissesBoxHeight;
	float CoolMissesMinMissDistance;
	float CoolMissesMaxLightweightEntityMass;
	float CoolMissesProbability;
	float CoolMissesCooldown;
	
	float SmartPathFollower_LookAheadDistance;

	static void CommTest(IConsoleCmdArgs* args);
	static void CommTestStop(IConsoleCmdArgs* args);
	static void CommWriteStats(IConsoleCmdArgs* args);
	static void CommResetStats(IConsoleCmdArgs* args);
	static void CommDebugMNMAgentType(IConsoleCmdArgs *args);
	static void CommMNMCalculateAccessibility(IConsoleCmdArgs *args); // TODO: remove

	static void CmdValidateAllSmartObjects(IConsoleCmdArgs* args);
};


#endif
